package cn.rocky.prepare;

public class countDigitOne {

    public int countDigitOne(int n) {
        // mulk 表示 10^k
        // 在下面的代码中，可以发现 k 并没有被直接使用到（都是使用 10^k）
        // 但为了让代码看起来更加直观，这里保留了 k
        long mulk = 1;
        int ans = 0;
        for (int k = 0; n >= mulk; ++k) {
            ans += (n / (mulk * 10)) * mulk + Math.min(Math.max(n % (mulk * 10) - mulk + 1, 0), mulk);
            mulk *= 10;
        }
        return ans;
    }

    public int countDigitOne1(int n) {
        int ans = 0;
        long base = 1;
        while(base <= n){
            int a =  (int)(n / base);
            int b = (int)(n % base);
            int cur = a % 10;
            a = a /10;
            if(cur > 1){
                ans += ((a + 1) * base);
            }else if(cur == 1){
                ans += (a*base + b + 1);
            }else {
                ans += a*base;
            }
            base *= 10;
        }
        return ans;
    }

    public static void main(String[] args) {
        countDigitOne countDigitOne = new countDigitOne();
        System.out.println(countDigitOne.countDigitOne(12));
    }
}
